<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  
  <title>澹台灭明的博客</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  <meta name="description" content="记录学习生活的个人博客，专业计算机科学与技术">
<meta property="og:type" content="website">
<meta property="og:title" content="澹台灭明的博客">
<meta property="og:url" content="http://hitfyd.gitee.com/index.html">
<meta property="og:site_name" content="澹台灭明的博客">
<meta property="og:description" content="记录学习生活的个人博客，专业计算机科学与技术">
<meta property="og:locale" content="zh-CN">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="澹台灭明的博客">
<meta name="twitter:description" content="记录学习生活的个人博客，专业计算机科学与技术">
  
    <link rel="alternate" href="/atom.xml" title="澹台灭明的博客" type="application/atom+xml">
  
  
    <link rel="icon" href="/favicon.png">
  
  
    <link href="//fonts.googleapis.com/css?family=Source+Code+Pro" rel="stylesheet" type="text/css">
  
  <link rel="stylesheet" href="/css/style.css">
  

</head>

<body>
  <div id="container">
    <div id="wrap">
      <header id="header">
  <div id="banner"></div>
  <div id="header-outer" class="outer">
    <div id="header-title" class="inner">
      <h1 id="logo-wrap">
        <a href="/" id="logo">澹台灭明的博客</a>
      </h1>
      
        <h2 id="subtitle-wrap">
          <a href="/" id="subtitle">以貌取人，失之子羽。</a>
        </h2>
      
    </div>
    <div id="header-inner" class="inner">
      <nav id="main-nav">
        <a id="main-nav-toggle" class="nav-icon"></a>
        
          <a class="main-nav-link" href="/">Home</a>
        
          <a class="main-nav-link" href="/archives">Archives</a>
        
      </nav>
      <nav id="sub-nav">
        
          <a id="nav-rss-link" class="nav-icon" href="/atom.xml" title="RSS Feed"></a>
        
        <a id="nav-search-btn" class="nav-icon" title="搜索"></a>
      </nav>
      <div id="search-form-wrap">
        <form action="//google.com/search" method="get" accept-charset="UTF-8" class="search-form"><input type="search" name="q" class="search-form-input" placeholder="Search"><button type="submit" class="search-form-submit">&#xF002;</button><input type="hidden" name="sitesearch" value="http://hitfyd.gitee.com"></form>
      </div>
    </div>
  </div>
</header>
      <div class="outer">
        <section id="main">
  
    <article id="post-PJSIP Android编译" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/2018/05/08/PJSIP Android编译/" class="article-date">
  <time datetime="2018-05-07T16:00:00.000Z" itemprop="datePublished">2018-05-08</time>
</a>
    
  <div class="article-category">
    <a class="article-category-link" href="/categories/Learn/">Learn</a>
  </div>

  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 itemprop="name">
      <a class="article-title" href="/2018/05/08/PJSIP Android编译/">PJSIP Android编译</a>
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <h1 id="资源准备"><a href="#资源准备" class="headerlink" title="资源准备"></a>资源准备</h1><p>操作系统：Ubuntu 18.04<br>PJSIP版本：2.6.0，下载地址<a href="http://www.pjsip.org/release/2.6/pjproject-2.6.tar.bz2" target="_blank" rel="external">http://www.pjsip.org/release/2.6/pjproject-2.6.tar.bz2</a> 。<br>（说明：2018年5月份时最新版本是2.7.2，但在2.6.0版本之后Android部分就没有修改，因此使用了2.6.0版本，如果有更新的版本可以查看版本说明，如果有新的Android部分修改可以酌情考虑使用新版本。）<br>Openh264版本：1.6.0，下载地址<a href="https://github.com/cisco/openh264/archive/v1.6.0.zip" target="_blank" rel="external">https://github.com/cisco/openh264/archive/v1.6.0.zip</a> 。（说明：没有使用最新版本，在<a href="https://trac.pjsip.org/repos/ticket/1947明确说明了使用1.6.0版本）" target="_blank" rel="external">https://trac.pjsip.org/repos/ticket/1947明确说明了使用1.6.0版本）</a><br>JDK：JDK最新版即可，不要使用openJDK<br>Android SDK：Android 25（根据测试机的安卓版本确定，对应Android 7.1.1，可酌情修改，可以安装Android Studio后在SDK Manager里下载）<br>Android SDK Tools：<a href="http://dl.google.com/android/android-sdk_r24.4.1-linux.tgz" target="_blank" rel="external">http://dl.google.com/android/android-sdk_r24.4.1-linux.tgz</a> 。（必需等于或小于该版本，之后的版本弃用android命令，导致编译失败）<br>NDK：13b，下载地址<a href="https://dl.google.com/android/repository/android-ndk-r13b-linux-x86_64.zip" target="_blank" rel="external">https://dl.google.com/android/repository/android-ndk-r13b-linux-x86_64.zip</a></p>
<h1 id="编译环境准备"><a href="#编译环境准备" class="headerlink" title="编译环境准备"></a>编译环境准备</h1><h2 id="配置Java环境变量"><a href="#配置Java环境变量" class="headerlink" title="配置Java环境变量"></a>配置Java环境变量</h2><p>将JDK解压，编辑/etc/profile配置文件，添加：</p>
<pre><code>export JAVA_HOME=你的JDK路径 
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib  
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
</code></pre><h2 id="配置SDK"><a href="#配置SDK" class="headerlink" title="配置SDK"></a>配置SDK</h2><p>可以安装Android Studio后在SDK Manager里下载相应SDK版本，然后将android-sdk_r24.4.1-linux.tgz解压后的tools文件夹覆盖Android Studio默认SDK里的tools文件夹。<br>编辑/etc/profile配置文件，添加：</p>
<pre><code>export ANDROID_SDK_ROOT=Android SDK路径
export PATH=$PATH:$ANDROID_SDK_ROOT/tools:$ANDROID_SDK_ROOT/platform-tools
</code></pre><h2 id="配置NDK"><a href="#配置NDK" class="headerlink" title="配置NDK"></a>配置NDK</h2><p>将NDK解压，编辑/etc/profile配置文件，添加：</p>
<pre><code>export ANDROID_NDK_ROOT=Android NDK路径
export PATH=$PATH:$ANDROID_NDK_ROOT
</code></pre><h2 id="更新环境变量"><a href="#更新环境变量" class="headerlink" title="更新环境变量"></a>更新环境变量</h2><p>临时：执行source /etc/profile，更新本次终端的环境变量；<br>长期：重启，/etc/profile文件在每次启动时均会加载</p>
<h1 id="编译"><a href="#编译" class="headerlink" title="编译"></a>编译</h1><h2 id="编译说明"><a href="#编译说明" class="headerlink" title="编译说明"></a>编译说明</h2><p>编译过程中所有Android版本均使用android 25（根据目标机的安卓版本确定，对应Android 7.1.1，可酌情修改）；<br>CPU架构均使用armeabi-v7a（根据目标机支持的架构确定，通常均支持armeabi-v7a，实际上目标机支持最好的CPU架构为arm64-v8a，但编译时NDK存在问题，未通过，因此退而求其次选择了armeabi-v7a）</p>
<h2 id="编译openh264"><a href="#编译openh264" class="headerlink" title="编译openh264"></a>编译openh264</h2><p>进入openh264目录，执行</p>
<pre><code>make OS=android NDKROOT =android-ndk-r13b路径 TARGET=android-25 PREFIX=./androidlib install-shared
</code></pre><p>注意，NDKROOT为前述NDK的路径，PREFIX为编译后生成的头文件和链接库的位置，这里是openh264目录下的androidlib文件夹，这个路径在编译PJSIP还要用于指明openh264位置。<br>Opneh264默认采用armeabi-v7a架构。</p>
<h2 id="PJSIP编译配置文件修改"><a href="#PJSIP编译配置文件修改" class="headerlink" title="PJSIP编译配置文件修改"></a>PJSIP编译配置文件修改</h2><p>因为项目需求，需要保证SIP通话过程中服务器不对音频数据包进行转码吗，因此需要减少PJSIP默认支持的音频编码格式，同时也可以减小编译出来的链接库大小。<br>在pjproject-2.6/pjlib/include/pj/中新建config_site.h文件，内容如下：</p>
<pre><code> /* Activate Android specific settings in the &apos;config_site_sample.h&apos; */  
#define PJ_CONFIG_ANDROID 1  
//To enable video  
#define PJMEDIA_HAS_VIDEO 1  
//To enable libyuv  
#define PJMEDIA_HAS_LIBYUV  1  
//To enable TCP transport  
#define PJ_HAS_TCP 1  
#include &lt;pj/config_site_sample.h&gt;  
</code></pre><p>修改config_site_sample.h中针对Android的配置如下：</p>
<pre><code>······
/*
 * Android sample settings.
 */
#if PJ_CONFIG_ANDROID
······
/* Disable some codecs */
#define PJMEDIA_HAS_L16_CODEC        0
#define PJMEDIA_HAS_GSM_CODEC        1 
#define PJMEDIA_HAS_SPEEX_CODEC        0
#define PJMEDIA_HAS_ILBC_CODEC        0
#define PJMEDIA_HAS_PCMU_CODEC        1 
#define PJMEDIA_HAS_PCMA_CODEC        1
#define PJMEDIA_HAS_G722_CODEC        0

#define PJMEDIA_RTP_PT_TELEPHONE_EVENTS        0
#define PJMEDIA_RTP_PT_TELEPHONE_EVENTS_STR        0

#define PJMEDIA_ADVERTISE_RTCP      0
······
</code></pre><p>上述修改主要是保留了GSM、PCMU、PCMA音频编码，取消了其余的静态编码方式和动态编码方式，可以根据需要酌情修改。</p>
<h2 id="PJSIP编译"><a href="#PJSIP编译" class="headerlink" title="PJSIP编译"></a>PJSIP编译</h2><h3 id="编译配置"><a href="#编译配置" class="headerlink" title="编译配置"></a>编译配置</h3><p>进入PJSIP目录，执行配置：</p>
<pre><code>NDK_TOOLCHAIN_VERSION=4.9 TARGET_ABI=armeabi-v7a APP_PLATFORM=android-25 ./configure-android --use-ndk-cflags --with-openh264=xxx/androidlib/  
</code></pre><p>注意：NDK_TOOLCHAIN_VERSION=4.9 这个必须设置，PjSip 2.6编译如果没有设置这个，configure-android无法配置成功；<br>APP_PLATFORM=android-25设置成自己需要运行的android版本；<br>–use-ndk-cflags 为系统选项，必须跟上；<br>–with-openh264=xxx/androidlib/ 设置成openh264编译成功后，生成的androidlib目录的绝对路径，参考openh264编译中PREFIX的目录名称。  </p>
<h3 id="编译PJSIP"><a href="#编译PJSIP" class="headerlink" title="编译PJSIP"></a>编译PJSIP</h3><pre><code>make dep &amp;&amp; make clean &amp;&amp; make
</code></pre><h3 id="使用SWIG编译java接口文件"><a href="#使用SWIG编译java接口文件" class="headerlink" title="使用SWIG编译java接口文件"></a>使用SWIG编译java接口文件</h3><p>安装swig： </p>
<pre><code>sudo apt install swig
</code></pre><p>进入pjproject-2.6/pjsip-apps/src/swig目录，执行：</p>
<pre><code>make
</code></pre><p>之后会在pjproject-2.6/pjsip-apps/src/swig/java/android/app/src/main/jniLibs目录下生成libpjsua2.so，在pjproject-2.6/pjsip-apps/src/swig/java/android/app/src/main生成java文件。这些文件是给apk开发使用的。</p>
<h1 id="项目构建"><a href="#项目构建" class="headerlink" title="项目构建"></a>项目构建</h1><p>进入到pjproject-2.6\pjsip-apps\src\swig\java\android\app\src\main\jniLibs目录中，根据前面编译时指定的CPU架构，所以新建目录armeabi-v7a，并把原来的armeabi目录里的的libpjsua2.so放入到新建的目录中，删除原来的ABI目录。并把openh264编译出来的libopenh264.so也拷贝到armeabi-v7a目录下。<br> 使用Android studio 导入pjproject-2.6\pjsip-apps\src\swig\java\android 目录中的工程。导入过程会持续很长时间，并按照提示解决配置错误，即可编译运行Demo程序。<br>如果要自己开发新工程，可以将pjproject-2.6\pjsip-apps\src\swig\java\android\app\src\main\java中的源代码复制到自己的项目里并进行修改即可。</p>
<h1 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h1><p>PJSIP Android构建文档：<br><a href="https://trac.pjsip.org/repos/wiki/Getting-Started/Android（最重要，许多疑问都是根据这里的相关的ticket解决的）" target="_blank" rel="external">https://trac.pjsip.org/repos/wiki/Getting-Started/Android（最重要，许多疑问都是根据这里的相关的ticket解决的）</a><br>PJSIP编译配置文件参数说明：<a href="http://www.pjsip.org/pjmedia/docs/html/group__PJMEDIA__CONFIG.htm" target="_blank" rel="external">http://www.pjsip.org/pjmedia/docs/html/group__PJMEDIA__CONFIG.htm</a><br>博客：<br><a href="http://blog.csdn.net/croop520/article/details/75332990" target="_blank" rel="external">http://blog.csdn.net/croop520/article/details/75332990</a><br><a href="http://blog.csdn.net/croop520/article/details/75346932" target="_blank" rel="external">http://blog.csdn.net/croop520/article/details/75346932</a><br><a href="http://blog.csdn.net/croop520/article/details/75352049" target="_blank" rel="external">http://blog.csdn.net/croop520/article/details/75352049</a>  </p>

      
    </div>
    <footer class="article-footer">
      <a data-url="http://hitfyd.gitee.com/2018/05/08/PJSIP Android编译/" data-id="cjgx8ue10000084v49n4xsc2j" class="article-share-link">Share</a>
      
      
  <ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/Android/">Android</a></li><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/PJSIP/">PJSIP</a></li><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/Ubuntu/">Ubuntu</a></li></ul>

    </footer>
  </div>
  
</article>


  
    <article id="post-在Ubuntu上编译安装FreeSWITCH" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/2017/11/27/在Ubuntu上编译安装FreeSWITCH/" class="article-date">
  <time datetime="2017-11-27T12:14:03.000Z" itemprop="datePublished">2017-11-27</time>
</a>
    
  <div class="article-category">
    <a class="article-category-link" href="/categories/Learn/">Learn</a>
  </div>

  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 itemprop="name">
      <a class="article-title" href="/2017/11/27/在Ubuntu上编译安装FreeSWITCH/">在Ubuntu上编译安装FreeSWITCH</a>
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <p>上次记录了miniSIPServer配置，如果没有特殊需求或者不想涉及过多SIP内容，其实miniSIPServer是个不错的选择。<br>对于开源的openSIPS和FreeSWITCH，两者其实系出同门，相比而言，FreeSWITCH作为后起之秀，配置文件均使用XML，相对于openSIPS的配置文件更容易上手，因此最终采用了FreeSWITCH作为项目服务器。</p>
<h1 id="FreeSWITCH简介"><a href="#FreeSWITCH简介" class="headerlink" title="FreeSWITCH简介"></a>FreeSWITCH简介</h1><p>FreeSWITCH是一个开源的电话软交换平台，主要开发语言是C，以MPL1.1发布。<br>关于更多FreeSWITCH信息可以参考FreeSWITCH中文站：<a href="http://www.freeswitch.org.cn" target="_blank" rel="external">http://www.freeswitch.org.cn</a> 或者阅读《FreeSWITCH权威指南》。</p>
<h1 id="FreeSWITCH编译"><a href="#FreeSWITCH编译" class="headerlink" title="FreeSWITCH编译"></a>FreeSWITCH编译</h1><h2 id="通用步骤"><a href="#通用步骤" class="headerlink" title="通用步骤"></a>通用步骤</h2><h3 id="下载源码"><a href="#下载源码" class="headerlink" title="下载源码"></a>下载源码</h3><p>Git代码库：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">git clone https://freeswitch.org/stash/scm/fs/freeswitch.git</div></pre></td></tr></table></figure></p>
<p>wget下载：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">wget http://files.freeswitch.org/freeswitch-releases/freeswitch-1.6.19.tar.xz</div></pre></td></tr></table></figure></p>
<h3 id="安装依赖库"><a href="#安装依赖库" class="headerlink" title="安装依赖库"></a>安装依赖库</h3><p>在不同的平台上，依赖不同的包，如：</p>
<p>CentOS:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">yum install -y subversion autoconf automake libtool gcc-c++ ncurses-devel make</div></pre></td></tr></table></figure></p>
<p>Ubuntu:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">sudo apt-get -y install build-essential subversion automake autoconf wget libtool libncurses5-dev</div><div class="line">//可能需要很多依赖包，这是另一个版本，都安装一下</div><div class="line">sudo apt-get install -y autoconf git libtool g++ zlib1g-dev  libjpeg-dev libsqlite3-dev  libcurl4-openssl-dev libpcre3-dev libspeex-dev  libspeexdsp-dev  libldns-dev libedit-dev libssl-dev  pkg-config yasm liblua5.2-dev libopus-dev libsndfile-dev libpq-dev pkg-config</div><div class="line">//缺少可能会出错的依赖包，也要安装</div><div class="line">sudo apt-get install libtiff4-dev</div></pre></td></tr></table></figure></p>
<p>完整依赖库需要参考 <a href="http://www.freeswitch.org.cn/Makefile" target="_blank" rel="external">http://www.freeswitch.org.cn/Makefile</a> ， 以确定平台上应该安装哪些包。</p>
<h3 id="编译安装的一般步骤"><a href="#编译安装的一般步骤" class="headerlink" title="编译安装的一般步骤"></a>编译安装的一般步骤</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">./bootstrap.sh   #如果下载的是tar包则省略这一步</div><div class="line">./configure</div><div class="line">make</div><div class="line">make install</div></pre></td></tr></table></figure>
<p>这里的每一步都需要运行很长时间，可能因为环境依赖问题报错停止，请耐心排查，参见<strong>编译问题</strong>。</p>
<h2 id="一条命令"><a href="#一条命令" class="headerlink" title="一条命令"></a>一条命令</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">cd /tmp &amp;&amp; wget http://www.freeswitch.org.cn/Makefile &amp;&amp; make</div></pre></td></tr></table></figure>
<p>通常会由于各种依赖库问题失败，所以还是老老实实按照通用步骤一步一步来吧。<br>注：如果实现安装了各种依赖库，有可能成功。</p>
<h2 id="编译问题"><a href="#编译问题" class="headerlink" title="编译问题"></a>编译问题</h2><p>好了，由于各种依赖库问题，下面进入填坑阶段。我的编译环境为<strong>Ubuntu Server 14.04 32位</strong>系统。</p>
<h3 id="运行-configure命令出错"><a href="#运行-configure命令出错" class="headerlink" title="运行./configure命令出错"></a>运行<em>./configure</em>命令出错</h3><p><em>./bootstrap.sh</em>命令通常不会出错，在运行<em>./configure</em>命令出错如下：</p>
<h4 id="安装libtiff4-dev"><a href="#安装libtiff4-dev" class="headerlink" title="安装libtiff4-dev"></a>安装libtiff4-dev</h4><p>出错如下：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">configure: error: &quot;Cannot build without libtiff (does your system require a libtiff-devel package?)&quot;</div><div class="line">configure: error: ./configure.gnu failed for libs/spandsp</div></pre></td></tr></table></figure></p>
<p>解决：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">sudo apt-get install libtiff4-dev</div></pre></td></tr></table></figure></p>
<p>重新运行<em>./configure</em>命令。</p>
<h3 id="运行make命令出错"><a href="#运行make命令出错" class="headerlink" title="运行make命令出错"></a>运行<em>make</em>命令出错</h3><p>出现一下情况就是<em>make</em>成功了！</p>
<img src="/2017/11/27/在Ubuntu上编译安装FreeSWITCH/make成功.jpg" title="我们的征途是星辰大海！">
<h3 id="其它错误请自行百度！"><a href="#其它错误请自行百度！" class="headerlink" title="其它错误请自行百度！"></a>其它错误请自行百度！</h3><h1 id="运行FreeSWITCH"><a href="#运行FreeSWITCH" class="headerlink" title="运行FreeSWITCH"></a>运行FreeSWITCH</h1><h2 id="添加命令链接"><a href="#添加命令链接" class="headerlink" title="添加命令链接"></a>添加命令链接</h2><p>FreeSWITCH在UNIX类操作系统上默认安装位置是/usr/local/freeswitch，两个常用命令是/usr/local/freeswitch/bin/freeswitch(启动freeswitch服务器)和/usr/local/freeswitch/bin/fs_cli(命令控制台)，因此将它们加入到搜索路径中，方便使用。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">ln -sf /usr/local/freeswitch/bin/freeswitch /usr/bin/</div><div class="line">ln -sf /usr/local/freeswitch/bin/fs_cli /usr/bin/</div></pre></td></tr></table></figure></p>
<h2 id="启动服务器"><a href="#启动服务器" class="headerlink" title="启动服务器"></a>启动服务器</h2><p>如果不想在前台启动freeswitch，可以将其启动在后台并通过fs_cli进行管理。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">freeswitch -nc</div><div class="line">fs_cli</div></pre></td></tr></table></figure></p>
<p>退出fs_cli控制台可以输入/exit或按Ctrl+D组合键。</p>
<h2 id="停止服务器"><a href="#停止服务器" class="headerlink" title="停止服务器"></a>停止服务器</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">freeswitch -stop</div></pre></td></tr></table></figure>
      
    </div>
    <footer class="article-footer">
      <a data-url="http://hitfyd.gitee.com/2017/11/27/在Ubuntu上编译安装FreeSWITCH/" data-id="cjai5buzy00051ov4vclzcapa" class="article-share-link">Share</a>
      
      
  <ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/FreeSWITCH/">FreeSWITCH</a></li><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/SIP/">SIP</a></li><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/Ubuntu/">Ubuntu</a></li></ul>

    </footer>
  </div>
  
</article>


  
    <article id="post-在云主机上安装、部署和调试miniSIPServer" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/2017/11/25/在云主机上安装、部署和调试miniSIPServer/" class="article-date">
  <time datetime="2017-11-25T01:53:41.000Z" itemprop="datePublished">2017-11-25</time>
</a>
    
  <div class="article-category">
    <a class="article-category-link" href="/categories/Learn/">Learn</a>
  </div>

  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 itemprop="name">
      <a class="article-title" href="/2017/11/25/在云主机上安装、部署和调试miniSIPServer/">在云主机上安装、部署和调试miniSIPServer</a>
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <p>根据项目主要的需求包括广域网内音频通话、即时消息、文件传输等，经过前期准备及调研，决定基于SIP协议开发，需要搭建公网SIP服务器，因此调研了相关SIP服务器，主要为miniSIPServer、openSIPS和FreeSWITCH，现总结miniSIPServer在云主机上的配置工作。</p>
<h1 id="miniSIPServer简介"><a href="#miniSIPServer简介" class="headerlink" title="miniSIPServer简介"></a>miniSIPServer简介</h1><p>miniSIPServer安装和设计都很简单，支持多个系统平台:Windows，<a href="https://www.myvoipapp.com/cn/docs/mss_services/linux/index.html" target="_blank" rel="external">Linux</a> ，<a href="https://www.myvoipapp.com/cn/docs/mss_services/raspberry_pi/index.html" target="_blank" rel="external">树莓派</a>（Raspberry Pi），分为20、50、100、300、500客户版本，中文官方网站在<a href="https://www.myvoipapp.com/cn/index.html" target="_blank" rel="external">https://www.myvoipapp.com/cn/index.html</a> 。<br>miniSIPServer是商业软件，提供一个月试用期（采用验证码注册，不过貌似多次安装不会累积试用期）。</p>
<h2 id="支持的SIP功能"><a href="#支持的SIP功能" class="headerlink" title="支持的SIP功能"></a>支持的SIP功能</h2><p>miniSIPServer支持SIP注册、SIP通话、STUN穿网、短消息，可以进行BUB（背靠背）服务，部署在公网服务器上基本可以保证用户局域网间通信。此外，还支持web管理界面，方便服务器的远程管理。<br>但是由于miniSIPServer不支持文件传输，并且担心试用期问题，最终没有选择其作为项目服务器。<br>miniSIPServer的详细特性如下：</p>
<h3 id="常用特性"><a href="#常用特性" class="headerlink" title="常用特性"></a>常用特性</h3><img src="/2017/11/25/在云主机上安装、部署和调试miniSIPServer/miniSIPServer常用特性.jpg" title="我们的征途是星辰大海！">
<h3 id="高级特性"><a href="#高级特性" class="headerlink" title="高级特性"></a>高级特性</h3><img src="/2017/11/25/在云主机上安装、部署和调试miniSIPServer/miniSIPServer高级特性.jpg" title="我们的征途是星辰大海！">
<h1 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h1><p>由于miniSIPServer在Windows下的安装十分简单，而且云主机操作系统为Ubuntu，因此主要记录Linux安装过程（官方文档参考<a href="https://www.myvoipapp.com/cn/docs/mss_services/linux/index.html" target="_blank" rel="external">https://www.myvoipapp.com/cn/docs/mss_services/linux/index.html</a> ）。</p>
<h2 id="Linux安装"><a href="#Linux安装" class="headerlink" title="Linux安装"></a>Linux安装</h2><p>安装版本为Debian/Ubuntu 32位20客户版（v31），下载链接为<a href="https://www.myvoipapp.com/download/mss_v31/linux/mss_v31_u20.deb" target="_blank" rel="external">https://www.myvoipapp.com/download/mss_v31/linux/mss_v31_u20.deb</a> 。</p>
<h3 id="下载miniSIPServer"><a href="#下载miniSIPServer" class="headerlink" title="下载miniSIPServer"></a>下载miniSIPServer</h3><p>使用<em>wget</em>命令：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">wget https://www.myvoipapp.com/download/mss_v31/linux/mss_v31_u20.deb</div></pre></td></tr></table></figure></p>
<h3 id="安装库文件"><a href="#安装库文件" class="headerlink" title="安装库文件"></a>安装库文件</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">sudo apt-get install libqt4-dev libqtcore4 libqtgui4 libqt4-network libqt4-xml libsrtp0-dev curl gcc g++</div></pre></td></tr></table></figure>
<h3 id="安装miniSIPServer"><a href="#安装miniSIPServer" class="headerlink" title="安装miniSIPServer"></a>安装miniSIPServer</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">sudo dpkg --install mss_v31_u20.deb</div></pre></td></tr></table></figure>
<h3 id="运行web管理界面"><a href="#运行web管理界面" class="headerlink" title="运行web管理界面"></a>运行web管理界面</h3><p>在Linux桌面环境下，直接点击链接图标即可，但不在Linux桌面环境下或远程管理时，需要启动web管理界面。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">/opt/sipserver/msscli&amp;</div></pre></td></tr></table></figure></p>
<p>运行结果如下：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div></pre></td><td class="code"><pre><div class="line">xxx@xxx:~# /opt/sipserver/msscli&amp;</div><div class="line">[1] 30317</div><div class="line">xxx@xxx:~# 2017-11-26 20:47:22  |  loading configuration files ...</div><div class="line">2017-11-26 20:47:22  |  Create service switch process ...</div><div class="line">2017-11-26 20:47:22  |  Create service control process ...</div><div class="line">2017-11-26 20:47:22  |  Create STUN process ...</div><div class="line">2017-11-26 20:47:22  |  Create media gateway process ...</div><div class="line">2017-11-26 20:47:22  |  Create SIP process ...</div><div class="line">2017-11-26 20:47:22  |  STUN server: xxx.xxx.xxx.xxx:3478</div><div class="line">2017-11-26 20:47:22  |  STUN server: xxx.xxx.xxx.xxx:3479</div><div class="line">2017-11-26 20:47:22  |  SIP server address (ipv4) is xxx.xxx.xxx.xxx</div><div class="line">2017-11-26 20:47:22  |  SIP server address (ipv6) is xxxx::xxxx:xxxx:xxxx:xxxx</div><div class="line">2017-11-26 20:47:22  |  SIP server UDP port is 5060</div><div class="line">2017-11-26 20:47:22  |  SIP server TCP port is 5060</div><div class="line">2017-11-26 20:47:22  |  Server (V31 build 20171121,linux) is ready.</div><div class="line">2017-11-26 20:47:23  |  Checking version online ...</div><div class="line">2017-11-26 20:47:23  |  There are no new updates available.</div></pre></td></tr></table></figure></p>
<p>注意输出第一行即为web登陆密码，在浏览器输入 服务器IP:8080 即可进入登录界面：<br><img src="/2017/11/25/在云主机上安装、部署和调试miniSIPServer/web登录.jpg" title="我们的征途是星辰大海！"><br>管理界面：<br><img src="/2017/11/25/在云主机上安装、部署和调试miniSIPServer/web管理界面.jpg" title="我们的征途是星辰大海！"></p>
<h3 id="关闭服务器"><a href="#关闭服务器" class="headerlink" title="关闭服务器"></a>关闭服务器</h3><p>通过查看进程ID，杀死进程（在官方文档中未找到Linux关闭命令）。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">ps -e</div><div class="line">//查看msscli进程PID</div><div class="line">kill PID</div></pre></td></tr></table></figure></p>
<h3 id="卸载"><a href="#卸载" class="headerlink" title="卸载"></a>卸载</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">sudo apt-get remove minisipserver</div></pre></td></tr></table></figure>
<h1 id="系统配置"><a href="#系统配置" class="headerlink" title="系统配置"></a>系统配置</h1><p>使用web管理界面-&gt;Data-&gt;System。</p>
<h2 id="基本设置"><a href="#基本设置" class="headerlink" title="基本设置"></a>基本设置</h2><img src="/2017/11/25/在云主机上安装、部署和调试miniSIPServer/基本设置.jpg" title="我们的征途是星辰大海！">
<table>
<thead>
<tr>
<th style="text-align:center">关键项</th>
<th style="text-align:center">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">管理员密码</td>
<td style="text-align:center">MSS系统管理员密码. 缺省为空. 如果配置了该密码, 则登录MSS GUI或者web管理界面时, 必须输入该密码进行鉴权.</td>
</tr>
<tr>
<td style="text-align:center">HTTP服务器端口</td>
<td style="text-align:center">用于启动MSS内部的HTTP/WWW服务器, 提供web管理界面</td>
</tr>
</tbody>
</table>
<p>某些标注了星号的配置需要重新启动MSS才能生效。</p>
<h2 id="SIP设置"><a href="#SIP设置" class="headerlink" title="SIP设置"></a>SIP设置</h2><img src="/2017/11/25/在云主机上安装、部署和调试miniSIPServer/SIP设置.jpg" title="我们的征途是星辰大海！">
<p>默认情况下, MSS总是自动获取本机IP地址以及缺省端口, 但是如果计算机上配置有多网卡IP或,5060端口对SIP应用不可用，则需要设置。</p>
<table>
<thead>
<tr>
<th style="text-align:center">关键项</th>
<th style="text-align:center">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">本机地址 (IPv4)</td>
<td style="text-align:center">MSS应当绑定的本机IPv4地址或者域名地址</td>
</tr>
<tr>
<td style="text-align:center">Realm</td>
<td style="text-align:center">SIP协议要求的’Realm’参数字段.</td>
</tr>
</tbody>
</table>
<h2 id="STUN设置"><a href="#STUN设置" class="headerlink" title="STUN设置"></a>STUN设置</h2><img src="/2017/11/25/在云主机上安装、部署和调试miniSIPServer/STUN设置.jpg" title="我们的征途是星辰大海！">
<table>
<thead>
<tr>
<th style="text-align:center">关键项</th>
<th style="text-align:center">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">主STUN服务器地址(MIP）</td>
<td style="text-align:center">MSS绑定的主STUN服务器地址</td>
</tr>
<tr>
<td style="text-align:center">主STUN服务器端口(MPORT)</td>
<td style="text-align:center">MSS绑定的主STUN服务器端口</td>
</tr>
</tbody>
</table>
<p>配置MSS同时充当VoIP网络中的STUN服务器,，协助SIP客户端进行私网穿越。通常, STUN服务器所在的PC应当安装两块网卡，配置两个独立的公共IP地址。如果只有一块网卡，可能无法检测部分私网类型。<br>如果不使用MSS充当STUN服务器，也可以使用其他STUN服务器，例如<br>    stun.xten.net<br>    stun.counterpath.net<br>    stun.zoiper.com<br>    stun.minisipserver.com<br>可参考<a href="http://blog.csdn.net/renfengmei/article/details/45368715" target="_blank" rel="external">免费的STUN 服务器列表</a>。</p>
<p>更多设置可以参考官方文档：<a href="https://www.myvoipapp.com/cn/docs/mss_services/manual/index.html" target="_blank" rel="external">https://www.myvoipapp.com/cn/docs/mss_services/manual/index.html</a> 。</p>
<h1 id="调试"><a href="#调试" class="headerlink" title="调试"></a>调试</h1><h2 id="语音单通或双不通"><a href="#语音单通或双不通" class="headerlink" title="语音单通或双不通"></a>语音单通或双不通</h2><p>主要是局域网穿越问题。</p>
<h3 id="局域网防火墙"><a href="#局域网防火墙" class="headerlink" title="局域网防火墙"></a>局域网防火墙</h3><p>某些局域网防火墙可能关闭了SIP应用所用端口，通常SIP网络通常会采用以下一些端口：5060，5061， 10000~20000端口。</p>
<h3 id="STUN"><a href="#STUN" class="headerlink" title="STUN"></a>STUN</h3><p>SIP应用在局域网内部，大多数情况下需要设置STUN（Simple Traversal of UDP through NATs）服务器帮助SIP终端进行私网穿越。大多数SIP应用都支持STUN协议。</p>
<h3 id="服务器设置转发媒体流"><a href="#服务器设置转发媒体流" class="headerlink" title="服务器设置转发媒体流"></a>服务器设置转发媒体流</h3><p>配置MSS转发媒体流。在分机的配置中，请点击“媒体类业务”页面，并配置“转发媒体流”项。<br><img src="/2017/11/25/在云主机上安装、部署和调试miniSIPServer/转发媒体流.jpg" title="我们的征途是星辰大海！"></p>
<h3 id="解除干扰"><a href="#解除干扰" class="headerlink" title="解除干扰"></a>解除干扰</h3><p>某些地区运营商会干扰、拦截SIP信令，可以试试修改标准的SIP端口或者采用“基于TCP的SIP”。</p>
<h2 id="Realm网域问题"><a href="#Realm网域问题" class="headerlink" title="Realm网域问题"></a>Realm网域问题</h2><p>如果以上都没能解决语音通话问题，那你有可能遇到了和我一样的问题，原因就是通常SIP账户形式是<em>sip：xxx@xxx.xxx.xxx.xxx</em>，‘@’之后可以是域名或者IP地址，需要和你在MSS中配置Data-&gt;System-&gt;SIP-&gt;SIP Realm值，其默认值是<em>myvoipapp.com</em>，需要修改为你的<strong>服务器IP地址</strong>或者对应的<strong>域名</strong>。<br><img src="/2017/11/25/在云主机上安装、部署和调试miniSIPServer/SIPRealm.jpg" title="我们的征途是星辰大海！"></p>

      
    </div>
    <footer class="article-footer">
      <a data-url="http://hitfyd.gitee.com/2017/11/25/在云主机上安装、部署和调试miniSIPServer/" data-id="cjai5bv0000061ov46h094dji" class="article-share-link">Share</a>
      
      
  <ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/SIP/">SIP</a></li><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/Ubuntu/">Ubuntu</a></li><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/miniSIPServer/">miniSIPServer</a></li><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/云主机/">云主机</a></li></ul>

    </footer>
  </div>
  
</article>


  
    <article id="post-云主机价格比较" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/2017/11/08/云主机价格比较/" class="article-date">
  <time datetime="2017-11-07T16:00:00.000Z" itemprop="datePublished">2017-11-08</time>
</a>
    
  <div class="article-category">
    <a class="article-category-link" href="/categories/Tool/">Tool</a>
  </div>

  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 itemprop="name">
      <a class="article-title" href="/2017/11/08/云主机价格比较/">云主机价格比较</a>
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <p>由于项目需求，需要一台公网服务器，首选当然是云主机了，故最近调研了一下国内外云服务提供商，整理一下。<br>因为对服务器性能要（zhu）求（yao）不（shi）高（qiong），因此我们只比较最低配置方案的按月计费价格（还有按需计费），大部分最低配置都是1CPU，1GB内存，赠送系统盘，公网IP，1Mbps带宽。</p>
<h1 id="国内云服务"><a href="#国内云服务" class="headerlink" title="国内云服务"></a>国内云服务</h1><p>国内提供云服务的运营商很多，挑选了较为典型的几家：<br>阿里云：<a href="http://www.aliyun.com/" target="_blank" rel="external">http://www.aliyun.com/</a><br>腾讯云：<a href="http://www.qcloud.com/" target="_blank" rel="external">http://www.qcloud.com/</a><br>青云：<a href="http://www.qingcloud.com/" target="_blank" rel="external">http://www.qingcloud.com/</a><br>UCloud：<a href="https://www.ucloud.cn/" target="_blank" rel="external">https://www.ucloud.cn/</a><br>美团云：<a href="https://mos.meituan.com/" target="_blank" rel="external">https://mos.meituan.com/</a><br>金山云：<a href="http://www.ksyun.com/" target="_blank" rel="external">http://www.ksyun.com/</a><br>华为云：<a href="http://www.hwclouds.com/" target="_blank" rel="external">http://www.hwclouds.com/</a><br>天翼云：<a href="http://www.ctyun.cn/" target="_blank" rel="external">http://www.ctyun.cn/</a><br>对于这八家，我觉得可以大致分为两大阵营：</p>
<h2 id="第一阵营"><a href="#第一阵营" class="headerlink" title="第一阵营"></a>第一阵营</h2><p>阿里云、青云、腾讯云、UCloud，这四家都属于<strong>较贵</strong>、<strong>贵</strong>、<strong>死贵</strong>一类的，通常计算、存储、网络都是分开计费的，相对来说适合企业用户。</p>
<h2 id="第二阵营"><a href="#第二阵营" class="headerlink" title="第二阵营"></a>第二阵营</h2><p>金山云、美团云、华为云、天翼云，价格相对来说较为适中，但是相对于前几年也是翻了几番，最低配置的月入价格在40—60之间，个人用户我觉得可以考虑这几家。</p>
<h2 id="划重点"><a href="#划重点" class="headerlink" title="划重点"></a>划重点</h2><p>总的来说，单从最低配置的月入价格从高到低依次为（2017年11月初统计）：<br>阿里云&gt;青云&gt;腾讯云&gt;UCloud&gt;金山云&gt;美团云&gt;天翼云&gt;华为云&gt;美团云（学生套餐）。<br>美团云的学生套餐虽然没有免费试用等营销，但贵在实在，低至8.8￥/月，相当划算。（对比而言，腾讯学生价10￥/月，但有限购，可以参考比较）。</p>
<h1 id="国外云服务"><a href="#国外云服务" class="headerlink" title="国外云服务"></a>国外云服务</h1><p>由于没有特殊的需求，考虑到国内的便捷性，国外的云服务提供商查找的比较少，主要包括：<br>AWS：<a href="http://aws.amazon.com/" target="_blank" rel="external">http://aws.amazon.com/</a><br>Azure：<a href="http://www.windowsazure.com/" target="_blank" rel="external">http://www.windowsazure.com/</a><br>Digital Ocean：<a href="https://www.digitalocean.com/" target="_blank" rel="external">https://www.digitalocean.com/</a><br>Linode：<a href="https://www.linode.com/" target="_blank" rel="external">https://www.linode.com/</a><br>虽然AWS一年免费，但感觉想干什么还是存在不少限制，一不小心就要付费，而其他的如Linode等普遍5$/月以上，而且普遍需要使用VISA等国际信用卡付款（没有国际信用卡，当然可以考虑代购），因此不再考虑。</p>
<h1 id="最终选择"><a href="#最终选择" class="headerlink" title="最终选择"></a>最终选择</h1><p>毫无疑问，最终选择了美团云的学生套餐：<a href="https://www.mtyun.com/activity-school?site=mos&amp;campaign=20170706sales" target="_blank" rel="external">https://www.mtyun.com/activity-school?site=mos&amp;campaign=20170706sales</a></p>
<img src="/2017/11/08/云主机价格比较/美团云套餐详情.jpg" title="套餐详情">
<p>注意活动期限是：2017年7月6日-2018年7月6日，通过学生认证后可以享受一年优惠，有需要的可以参考。</p>
<h2 id="友情提示"><a href="#友情提示" class="headerlink" title="友情提示"></a>友情提示</h2><p>购买云服务需要实名认证，除了要填写个人身份信息外，还需要准备身份证正面照（必需）、身份证反面照（可能要）、手持身份证照（可能要）；<br>如果要学生认证，还要额外准备学生证学籍信息页的照片。</p>
<h2 id="远程登录"><a href="#远程登录" class="headerlink" title="远程登录"></a>远程登录</h2><p>云主机的管理工具一开始使用云服务控制台提供的网页终端，但由于网络不稳定经常掉线，而且使用浏览器来模拟终究不太方便，体验不佳，因此考虑使用远程登录工具。</p>
<p>Windows平台可以使用<a href="https://www.chiark.greenend.org.uk/~sgtatham/putty/" target="_blank" rel="external">Putty</a>，使用很简单，输入云主机IP之后打开终端，输入账号密码即可操作。</p>
<p>Linux平台直接使用SSH即可。</p>

      
    </div>
    <footer class="article-footer">
      <a data-url="http://hitfyd.gitee.com/2017/11/08/云主机价格比较/" data-id="cjai5buzu00031ov435k8j5ui" class="article-share-link">Share</a>
      
      
  <ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/云主机/">云主机</a></li></ul>

    </footer>
  </div>
  
</article>


  
    <article id="post-Hexo学习" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/2017/11/07/Hexo学习/" class="article-date">
  <time datetime="2017-11-07T13:46:25.000Z" itemprop="datePublished">2017-11-07</time>
</a>
    
  <div class="article-category">
    <a class="article-category-link" href="/categories/Tool/">Tool</a>
  </div>

  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 itemprop="name">
      <a class="article-title" href="/2017/11/07/Hexo学习/">Hexo学习</a>
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <p>记录一些简单的<a href="https://hexo.io/zh-cn/" target="_blank" rel="external">Hexo</a>命令。</p>
<h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><h3 id="前提环境："><a href="#前提环境：" class="headerlink" title="前提环境："></a>前提环境：</h3><p><a href="http://nodejs.org/" target="_blank" rel="external">Node.js</a><br><a href="http://git-scm.com/" target="_blank" rel="external">Git</a><br>对于在Windows平台安装Git工具，我个人推荐图形化工具<a href="http://gitextensions.github.io/" target="_blank" rel="external">Git Extensions</a>，更方便易学。</p>
<h3 id="安装Hexo"><a href="#安装Hexo" class="headerlink" title="安装Hexo"></a>安装Hexo</h3><p>所有必备的应用程序安装完成后，即可使用 npm 安装 Hexo。​</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$ npm install -g hexo-cli</div></pre></td></tr></table></figure>
<h2 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h2><h3 id="初始化项目"><a href="#初始化项目" class="headerlink" title="初始化项目"></a>初始化项目</h3><p>安装 Hexo 完成后，在指定路径初始化项目。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">$ hexo init &lt;folder&gt; //例如E:\blog</div><div class="line">$ cd &lt;folder&gt;</div><div class="line">$ npm install</div></pre></td></tr></table></figure>
<h3 id="修改配置文件"><a href="#修改配置文件" class="headerlink" title="修改配置文件"></a>修改配置文件</h3><p>在项目根目录的_config.yml （区别于themes文件夹中不同主题下的_config.yml）中修改配置，简单只修改几个参数即可。</p>
<table>
<thead>
<tr>
<th style="text-align:center">参数</th>
<th style="text-align:center">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">title</td>
<td style="text-align:center">网站标题</td>
</tr>
<tr>
<td style="text-align:center">subtitle</td>
<td style="text-align:center">网站副标题</td>
</tr>
<tr>
<td style="text-align:center">description</td>
<td style="text-align:center">网站描述</td>
</tr>
<tr>
<td style="text-align:center">author</td>
<td style="text-align:center">作者名字</td>
</tr>
<tr>
<td style="text-align:center">url</td>
<td style="text-align:center">博客网址，例如<a href="http://xxx.com" target="_blank" rel="external">http://xxx.com</a></td>
</tr>
<tr>
<td style="text-align:center">root</td>
<td style="text-align:center">网站根目录，例如博客在<a href="http://xxx.com/blog/" target="_blank" rel="external">http://xxx.com/blog/</a>，则根目录是/blog/</td>
</tr>
</tbody>
</table>
<h2 id="写作"><a href="#写作" class="headerlink" title="写作"></a>写作</h2><p>将写好的Markdown文件放在\source_posts文件夹下即可。</p>
<h3 id="generate"><a href="#generate" class="headerlink" title="generate"></a>generate</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$ hexo generate</div></pre></td></tr></table></figure>
<p>生成静态文件。</p>
<h3 id="server"><a href="#server" class="headerlink" title="server"></a>server</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$ hexo server</div></pre></td></tr></table></figure>
<p>启动本地服务器查看网页。默认情况下，访问网址为： <a href="http://localhost:4000/" target="_blank" rel="external">http://localhost:4000/</a>。</p>
<h2 id="写作标签"><a href="#写作标签" class="headerlink" title="写作标签"></a>写作标签</h2><h3 id="Front-matter"><a href="#Front-matter" class="headerlink" title="Front-matter"></a>Front-matter</h3><p>Front-matter 是文件最上方以 — 分隔的区域，用于指定文件的部分变量，例如本文的Front-matter为：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">title: Hexo学习</div><div class="line">date: 2017/11/07 21:46:25</div><div class="line">categories: Tool </div><div class="line">tags: Hexo</div><div class="line">---</div></pre></td></tr></table></figure>
<h3 id="资源图片"><a href="#资源图片" class="headerlink" title="资源图片"></a>资源图片</h3><p>如果想在文章中显示图片和其他资源，需要开启资源文件管理功能，通过将 <em>config.yml</em> 文件中的 <em>post_asset_folder</em> 选项设为 <em>true</em> 来打开。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">_config.yml</div><div class="line">post_asset_folder: true</div></pre></td></tr></table></figure>
<p>当资源文件管理功能打开后， markdown 文件所在文件夹下会有一个同名资源文件夹，可以将资源放在这个关联文件夹中通过相对路径来引用它们。</p>
<h3 id="相对路径引用的标签插件"><a href="#相对路径引用的标签插件" class="headerlink" title="相对路径引用的标签插件"></a>相对路径引用的标签插件</h3><p>常规的markdown语法和相对路径来引用图片和其他资源可能会导致它们在存档页或者主页上显示不正确。此时应该使用Hexo的标签插件：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">&#123;% asset_path slug %&#125;</div><div class="line">&#123;% asset_img slug [title] %&#125;</div><div class="line">&#123;% asset_link slug [title] %&#125;</div></pre></td></tr></table></figure>
<p>比如说：当你打开文章资源文件夹功能后，你把一个 example.jpg 图片放在了你的资源文件夹中，如果通过使用相对路径的常规 markdown 语法 </p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">![](/example.jpg)</div></pre></td></tr></table></figure>
<p>它将不会出现在首页上（但是它会在文章中按你期待的方式工作）。<br>正确的引用方式是使用下列标签插件：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">&#123;% asset_img example.jpg This is an example image %&#125;</div></pre></td></tr></table></figure>
<p>这样图片将会同时出现在文章、主页以及归档页中。</p>
<h2 id="发布"><a href="#发布" class="headerlink" title="发布"></a>发布</h2><p>首先，修改根目录下的_config.yml 配置文件。​</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">deploy:</div><div class="line">  type: git</div><div class="line">  repo: &lt;repository url&gt;</div><div class="line">  branch: [branch]</div><div class="line">  message: [message]</div></pre></td></tr></table></figure>
<table>
<thead>
<tr>
<th style="text-align:center">参数</th>
<th style="text-align:center">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">type</td>
<td style="text-align:center">部署类型，可以有多个，会依次部署</td>
</tr>
<tr>
<td style="text-align:center">repo</td>
<td style="text-align:center">库地址，例如 <a href="https://xxx.git" target="_blank" rel="external">https://xxx.git</a></td>
</tr>
<tr>
<td style="text-align:center">branch</td>
<td style="text-align:center">分支名称</td>
</tr>
<tr>
<td style="text-align:center">message</td>
<td style="text-align:center">提交信息 (默认为更新时间)</td>
</tr>
</tbody>
</table>
<h3 id="deploy"><a href="#deploy" class="headerlink" title="deploy"></a>deploy</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$ hexo deploy</div></pre></td></tr></table></figure>
<p>部署网站，可能会需要输入账号密码。</p>
<h3 id="生成并部署"><a href="#生成并部署" class="headerlink" title="生成并部署"></a>生成并部署</h3><p>可以让 Hexo 在生成完毕后自动部署网站，下列两个命令的作用是相同的。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">$ hexo generate --deploy</div><div class="line">$ hexo deploy --generate</div></pre></td></tr></table></figure>
<p>上面两个命令可以简写为</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">$ hexo g -d</div><div class="line">$ hexo d -g</div></pre></td></tr></table></figure>

      
    </div>
    <footer class="article-footer">
      <a data-url="http://hitfyd.gitee.com/2017/11/07/Hexo学习/" data-id="cjai5buzo00011ov4xdboip3i" class="article-share-link">Share</a>
      
      
  <ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/Hexo/">Hexo</a></li></ul>

    </footer>
  </div>
  
</article>


  
    <article id="post-Hello World!" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/2017/11/07/Hello World!/" class="article-date">
  <time datetime="2017-11-06T16:00:00.000Z" itemprop="datePublished">2017-11-07</time>
</a>
    
  <div class="article-category">
    <a class="article-category-link" href="/categories/拾遗/">拾遗</a>
  </div>

  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 itemprop="name">
      <a class="article-title" href="/2017/11/07/Hello World!/">Hello World!</a>
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <p>本博客将记录学习工作中遇到的点点滴滴，欢迎大家共同学习。<br>本博客依托<a href="https://gitee.com" target="_blank" rel="external">码云</a>搭建，采用了<a href="https://hexo.io/zh-cn/" target="_blank" rel="external">Hexo</a>博客框架。具体搭建过程参考<a href="http://git.mydoc.io/?t=154714" target="_blank" rel="external">码云Pages</a>和<a href="https://hexo.io/zh-cn/" target="_blank" rel="external">Hexo</a>。<br>开启博客生涯!</p>
<p>2017.11.07</p>
<img src="/2017/11/07/Hello%20World!/那年那兔那些事儿.jpg" title="我们的征途是星辰大海！">
      
    </div>
    <footer class="article-footer">
      <a data-url="http://hitfyd.gitee.com/2017/11/07/Hello World!/" data-id="cjai5buzi00001ov45t8bp7lb" class="article-share-link">Share</a>
      
      
    </footer>
  </div>
  
</article>


  

</section>
        
          <aside id="sidebar">
  
    
  <div class="widget-wrap">
    <h3 class="widget-title">分类</h3>
    <div class="widget">
      <ul class="category-list"><li class="category-list-item"><a class="category-list-link" href="/categories/Learn/">Learn</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/Tool/">Tool</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/拾遗/">拾遗</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">标签</h3>
    <div class="widget">
      <ul class="tag-list"><li class="tag-list-item"><a class="tag-list-link" href="/tags/Android/">Android</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/FreeSWITCH/">FreeSWITCH</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Hexo/">Hexo</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/PJSIP/">PJSIP</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/SIP/">SIP</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Ubuntu/">Ubuntu</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/miniSIPServer/">miniSIPServer</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/云主机/">云主机</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">标签云</h3>
    <div class="widget tagcloud">
      <a href="/tags/Android/" style="font-size: 10px;">Android</a> <a href="/tags/FreeSWITCH/" style="font-size: 10px;">FreeSWITCH</a> <a href="/tags/Hexo/" style="font-size: 10px;">Hexo</a> <a href="/tags/PJSIP/" style="font-size: 10px;">PJSIP</a> <a href="/tags/SIP/" style="font-size: 15px;">SIP</a> <a href="/tags/Ubuntu/" style="font-size: 20px;">Ubuntu</a> <a href="/tags/miniSIPServer/" style="font-size: 10px;">miniSIPServer</a> <a href="/tags/云主机/" style="font-size: 15px;">云主机</a>
    </div>
  </div>

  
    
  <div class="widget-wrap">
    <h3 class="widget-title">归档</h3>
    <div class="widget">
      <ul class="archive-list"><li class="archive-list-item"><a class="archive-list-link" href="/archives/2018/05/">五月 2018</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2017/11/">十一月 2017</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">最新文章</h3>
    <div class="widget">
      <ul>
        
          <li>
            <a href="/2018/05/08/PJSIP Android编译/">PJSIP Android编译</a>
          </li>
        
          <li>
            <a href="/2017/11/27/在Ubuntu上编译安装FreeSWITCH/">在Ubuntu上编译安装FreeSWITCH</a>
          </li>
        
          <li>
            <a href="/2017/11/25/在云主机上安装、部署和调试miniSIPServer/">在云主机上安装、部署和调试miniSIPServer</a>
          </li>
        
          <li>
            <a href="/2017/11/08/云主机价格比较/">云主机价格比较</a>
          </li>
        
          <li>
            <a href="/2017/11/07/Hexo学习/">Hexo学习</a>
          </li>
        
      </ul>
    </div>
  </div>

  
</aside>
        
      </div>
      <footer id="footer">
  
  <div class="outer">
    <div id="footer-info" class="inner">
      &copy; 2018 hitfyd@foxmail.com<br>
      Powered by <a href="http://hexo.io/" target="_blank">Hexo</a>
    </div>
  </div>
</footer>
    </div>
    <nav id="mobile-nav">
  
    <a href="/" class="mobile-nav-link">Home</a>
  
    <a href="/archives" class="mobile-nav-link">Archives</a>
  
</nav>
    

<script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>


  <link rel="stylesheet" href="/fancybox/jquery.fancybox.css">
  <script src="/fancybox/jquery.fancybox.pack.js"></script>


<script src="/js/script.js"></script>

  </div>
</body>
</html>